/**
 * 整数进制转换(支持大数,2-64任意进制)
 * @param v int|string 被转换的值
 * @param s int 被转换值的进制
 * @param t int 转换目标的进制
 * @param B string 64进制的末两位
 * @return string  '':参数异常
 */
$.radix = function(v, s, t, B='_$'){
	let BS=$.s64, BM={2:1,4:2,8:3,16:4,32:5,64:6};
	function PRE(v){ return v.replace(/^0+/,''); }
	function CHK(v, n){ // 检测v是n进制
		for(let i=0; i<v.length; i++){
			let x = BS.indexOf(v[i]);
			if(x===-1 || x>=n) return false;
		}
		return true;
	}
	function BIT(m, v, s, t){ // 快速计算: s与t为2,4,8,16,32,64
		if(s===2){ if(/[^01]/.test(v)) return ''; }
		else{
			let c=v, b=BM[s], len=c.length;  v='';
			for(let i=0; i<len; i++){
				let n = BS.indexOf(c[i]);
				if(n===-1 || n>s) return '';
				v += $.pad(n.toString(2), b);
			}
			if(t===2) return m+PRE(v);
		}
		let i=0, b=BM[t], n=Math.ceil(v.length/b)*b, x=''; v=$.pad(v,n);
		while(i<n) x+=BS[parseInt(v.slice(i,i=i+b),2)]; return m+PRE(x);
	}
	function DEC(v, n){ // 非大数十进制v转为n进制
		let rtn='', m;
		do{ m=v%n; rtn=BS[m]+rtn; v=(v-m)/n; }while(v);
		return rtn;
	}
	function ADD(a, b, n){ // 加法: a,b均为n进制
		if(a==='0') return b;  if(b==='0') return a;
		let rtn='', m=Math.max(a.length,b.length), c=0;
		if(m>a.length) a=$.pad(a,m); else b=$.pad(b,m);
		while(m--){
			c+=BS.indexOf(a[m])+BS.indexOf(b[m]);
			rtn = BS[c%n] + rtn;  c = c<n ? 0 : 1;
		}
		return c ? '1'+rtn : PRE(rtn)||'0';
	}
	function MUL(a, m, n){ // 乘法: a为n进制,m为10进制
		if(m===0) return '0'; if(m===1) return a;  let rtn=a;
		for(let i=1; i<m; i++) rtn=ADD(rtn,a,n);  return rtn;
	}
	$.radix = function(v, s, t, B='_$'){
		if(!(s*=1) || s<2 || s>64 || !(t*=1) || t<2 || t>64) return '';
		if(!v) return v===0?'0':''; v+=''; let m=''; BS=BS.slice(0,62)+B;
		if(v[0]==='-'){ m='-'; v=v.slice(1); if(!v) return ''; }
		v=PRE(v);  if(!v) return '0'; if(s===t) return CHK(v,s)?m+v:'';
		if(BM[s] && BM[t]) return BIT(m,v,s,t);//快速计算:2,4,8,16,32,64
		let n=v.length, x=BS.indexOf(v[n-1]); if(x<0 || x>=s) return '';
		let rtn=DEC(x,t), pow=DEC(s,t);
		for(let i=2; i<=n; i++){
			let x=BS.indexOf(v[n-i]); if(x<0 || x>=s) return '';
			rtn=ADD(rtn,MUL(pow,x,t),t);  if(n!==i) pow=MUL(pow,s,t);
		}
		return m+PRE(rtn);
	};
	return $.radix(v, s, t, B);
};
